Le package ondetools vise à faciliter le chargement et l’exploitation des données de l’observatoire des étiages. Ces données sont téléchargeables depuis l’url suivante.
La logique suivie est celle d’une chaîne de traitements depuis le téléchargement des données brutes sur le web jusqu’à la visualisation cartographique.
Il propose un ensemble de fonctions qui permettent de :
- télécharger les fichiers bruts annuels annuels
- les décompresser
- les assembler
- recoder les régions (fusions)
- pivoter le tableau en format “large”
- compléter les données des stations par des données sur les SAGEs
- calculer les statistiques d’assecs estivaux
- visualiser graphiquement le “tableau de bord” de chacune des stations
- exporter ces graphiques au format .bmp
- visualiser les données en cartographie dynamique
La chaîne de traitements étant dédiée aux données ONDE au format standardisé de leur diffusion, elle ne fonctionne que dans la mesure où l’utilisateur conserve les noms des variables. Le moindre renommage et plus rien ne marche !
L’installation du package se fait par la fonction library. Pour fonctionner, il fait appel à d’autres packages qui sont aussi installés par défaut quand on installe , ondetools.
library(ondetools)
# autres packages nécessaire pour exécuter les lignes de code ci-dessous
library(tidyverse)
library(sf)
library(mapview)Chaque fonction est accompagnée d’un fichier d’aide. Exemple :
Le stockage par défaut de ces fichiers est dans un sous-répertoire du répertoire de travail "raw_data/fichiers_onde_annuels_zippes".
url_onde <- "https://onde.eaufrance.fr/content/t%C3%A9l%C3%A9charger-les-donn%C3%A9es-des-campagnes-par-ann%C3%A9e"
telecharger_fichiers_onde_annuels(url = url_onde, raw_data_dir = 'raw_data')
#> Warning in dir.create(raw_data_dir): 'raw_data' existe déjà
#> Warning in download.file(url, destfile = year_data_file_path): cannot open
#> URL 'https://onde.eaufrance.fr/sites/default/files/fichiers-telechargeables/
#> onde_france_2020.zip': HTTP status was '404 Not Found'
#> Warning in unzip(zipfile = year_data_file_path, exdir = annual_onde_files_dir):
#> erreur 1 lors de l'extraction d'un fichier zipVérification que les fichiers annuels zippés sont dans le bon répertoire
list.files("raw_data/fichiers_onde_annuels_zippes")
#> [1] "metadonnees.pdf" "onde_france_2012.csv" "onde_france_2012.zip"
#> [4] "onde_france_2013.csv" "onde_france_2013.zip" "onde_france_2014.csv"
#> [7] "onde_france_2014.zip" "onde_france_2015.csv" "onde_france_2015.zip"
#> [10] "onde_france_2016.csv" "onde_france_2016.zip" "onde_france_2017.csv"
#> [13] "onde_france_2017.zip" "onde_france_2018.csv" "onde_france_2018.zip"
#> [16] "onde_france_2019.csv" "onde_france_2019.zip"Il s’agit d’empiler les fichiers annuels.
Les dimensions du tableau de données ou data.frame :
Il y a donc 155308 lignes et 20 colonnes.
Les caractéristiques des variables peuvent être obtenues par la fonction str() :
str(onde)
#> Classes 'data.table' and 'data.frame': 155308 obs. of 20 variables:
#> $ CdSiteHydro : chr "B4540001" "H1001012" "H1060001" "H1140001" ...
#> $ LbSiteHydro : chr "La Thinte à Chaumont" "L'Aisne à Pretz en Argonne" "Le ruisseau de Parfondrupt aux Islettes" "Le ruisseau de Maconrupt à Aubreville" ...
#> $ Annee : int 2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
#> $ TypeCampObservations : chr "complémentaire" "complémentaire" "complémentaire" "complémentaire" ...
#> $ DtRealObservation : chr "2012-05-15" "2012-05-15" "2012-05-15" "2012-05-15" ...
#> $ LbRsObservationDpt : chr "Ecoulement visible acceptable" "Ecoulement visible acceptable" "Ecoulement visible acceptable" "Ecoulement visible acceptable" ...
#> $ RsObservationDpt : chr "1a" "1a" "1a" "1a" ...
#> $ LbRsObservationNat : chr "Ecoulement visible" "Ecoulement visible" "Ecoulement visible" "Ecoulement visible" ...
#> $ RsObservationNat : int 1 1 1 1 1 1 1 1 1 1 ...
#> $ NomEntiteHydrographique: chr "La Thinte" "L'Aisne" "Ruisseau de Parfonrupt" "Ruisseau de Maconrut" ...
#> $ CdTronconHydrographique: chr "B45-0210" "H1--0200" "H1062300" "H1141000" ...
#> $ LbCommune : chr "CHAUMONT-DEVANT-DAMVILLERS" "PRETZ-EN-ARGONNE" "LES ISLETTES" "AUBREVILLE" ...
#> $ CdCommune : chr "55107" "55409" "55253" "55014" ...
#> $ CdDepartement : chr "55" "55" "55" "55" ...
#> $ LbRegion : chr "LORRAINE" "LORRAINE" "LORRAINE" "LORRAINE" ...
#> $ NomCircAdminBassin : chr "RHIN-MEUSE" "SEINE-NORMANDIE" "SEINE-NORMANDIE" "SEINE-NORMANDIE" ...
#> $ CoordXSiteHydro : num 876633 857159 845444 850888 846196 ...
#> $ CoordYSiteHydro : num 6914591 6875002 6892830 6895708 6875919 ...
#> $ ProjCoordSiteHydro : int 26 26 26 26 26 26 26 26 26 26 ...
#> $ FLG : chr "FLG" "FLG" "FLG" "FLG" ...
#> - attr(*, ".internal.selfref")=<externalptr>Entre le début et la fin de la série, certaines régions ont été regroupées. Pour avoir une cohérence d’ensemble du jeu de données, la variable LbRegion est recodée pour se conformer au découpage régional en 2020. Une variable Mois est créée à partir de la date d’observation. Pour un usage graphique ultérieur, elle est en format alphanumérique à 2 caractères.
Il existe plusieurs variables correspondants aux départements, régions, districts hydrographiques qui permettent de filtrer simplement. Ici, nous nous intéressons aux régions Bretagne et Pays-de-la-Loire.
La fonction gerer_les_campagnes filtre les données pour ne conserver qu’une observation par mois. De mai à septembre inclus, c’est l’observation de la campagne “usuelle” qui est retenue. D’octobre à avril, c’est la plus sèche des observations “complémentaires”.
Pour certains usages comme la visualisation des observations d’un mois donné (ex : juillet 2018) avec QGIS, il peut être intéressant de disposer des mêmes données, mais avec une colonne par année_mois. La fonction passer_en_format_large() permet cette manipulation en pivotant les cellules à la manière d’un tableau croisé dynamique dans Excel®.
On peut à ce stade exporter les tableaux de données en format texte directement lisible par Excel dans un répertoire “processed_data”.
dir.create(file.path(subDir = 'processed_data'), showWarnings = FALSE)
write_excel_csv2(x = onde, path = 'processed_data/onde_long.csv')
write_excel_csv2(x = onde_lb_large, path = 'processed_data/onde_large.csv')Nettoyage de l’espace de travail
Il s’agit de transformer le tableau de données au format “long” en objet géographique “points” au moyen de ses colonnes de coordonnées (CoordXSiteHydro et CoordYSiteHydro). Le système de projection est Lambert 93.
Vérification
Si l’on dispose d’une couche shapefile des SAGEs, il peut être intéressant de les croiser avec les données d’étiage, par exemple pour produire des tableaux de bord par SAGE.
chemin <- "//svfcvin2/DFS/COMMUNS/REGIONS/BRE/DR/dr35_IG_metier/CATALOGUE/EAU/GESTION_TERRITOIRE/SAGE/sage_2016_DIR2_shp.shp"
sages <- lire_couche_sages(fichier_shp = couche_sage, scr = 2154)#> Reading layer `sage_2016_DIR2_shp' from data source `D:\Pascal\boulot\onde\donnees_geographiques_reference\sage_2016_DIR2_shp.shp' using driver `ESRI Shapefile'
#> Simple feature collection with 43 features and 12 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: 123905 ymin: 6559835 xmax: 609715.2 ymax: 6892897
#> epsg (SRID): NA
#> proj4string: +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs
Vérification
Pour associer à chaque station les données sur son SAGE, jointure spatiale :
Comme en Bretagne - Pays de Loire la couche des SAGE est approximative, il y a des pbs à l’issue de la jointure \(\Rightarrow\) un nettoyage de la couche est nécessaire.
On recherche d’éventuels doublons là où les SAGEs se chevauchent. Pour ce faire, on visualise en rouge les points qui sont des doublons (= situés sur + d’un SAGE).
doublons <- stations_onde_geo$CdSiteHydro %>%
table %>%
as.data.frame() %>%
filter(Freq > 1) %>%
.[,1] %>%
as.character()
doublons_geo <- stations_onde_geo %>%
filter(CdSiteHydro %in% doublons)
mapview(stations_onde_geo, viewer.suppress = FALSE, legend = FALSE) +
mapview(sages, zcol = "NOM", alpha = 0.1, legend = FALSE) +
mapview(doublons_geo, color = "red", legend = FALSE)Il apparaît que le seul problème est le Frout (J3104013), mal affecté à cause du chevauchement entre deux périmètres de SAGE. On corrige manuellement. On garde aussi pour visualisation des stations ONDE hors SAGE mais dans les régions de l’étude.
Pour permettre de visualiser la fréquence des assecs sur le périmètre étudié, il est nécessaire d’agréger les données par station. Comme les efforts de collecte de données sont standardisés pour les campagnes “usuelles” (une observation par mois), tandis que les campagnes compléentaires varient fortement d’un département à un autre, seules les premières sont retenues.
La fonction calculer_assecs_ete() retourne un dataframe donnant pour chaque station (ligne) le nombre d’observations, le nombre d’assecs et le pourcentage des observations où la station était en assec.
On complète la couche géographique des stations avec ces données.
stations_onde_geo <- ajouter_donnees_assecs_aux_stations(stations_geo = stations_onde_geo,
assecs_df = assecs)
#> Joining, by = "CdSiteHydro"Si nécessaire, on peut reprojeter en WGS84 - le système utilisé par OpenStreetMap ou GoogleMaps.
Si l’on veut vérifier la cohérence des étapes précédentes, on peut visualiser les objets.
On définit une palette de couleurs pour s’assurer qu’une même situation soit systématiquement représentée par une même couleur dans les graphiques.
Le \n est le retour à la ligne pour que les étiquettes ne prennent pas trop de place sur le graphique
mes_couleurs <- c("Ecoulement\nvisible" = "blue",
"Ecoulement\nnon visible" = "brown",
"Assec" = "red",
"Observation\nimpossible" = "grey",
"NA" = "grey")Pour les besoins de la représentation graphique, on complète le fichier avec des NA (données manquantes) pour les mois sans observations. La fonction completer_observations_mois_manquants est alors utile.
ma_station <- onde %>% pull(CdSiteHydro) %>% .[3689] #Q choix d'une station au pif
produire_graph_pour_une_station(code_station = ma_station, onde_df = onde_ts_mois, couleurs = mes_couleurs)Le logiciel R permet la manipulation de nombreuses classes d’objets parmi lesquelles on trouve les listes. Une liste est un ensemble d’élements qui peuvent être de nature différente. Ici, nous allons créer une liste qui contiendra autant d’objets graphiques qu’il y a de stations.
La fonction produire_graph_pour_toutes_les_stations est une moulinette qui permet d’appliquer la fonction de production du graphique (produire_graph_pour_une_station()) non pas à une station, mais à un ensemble.
Cette liste servira soit pour afficher les graphiques sous la forme de popups dans mapview, soit pour les exporter 1 à 1 en png pour d’autres usages.
graphiques <- produire_graph_pour_toutes_les_stations(stations = codes_stations,
fonction_graphique = produire_graph_pour_une_station,
onde_df = onde_ts_mois,
couleurs = mes_couleurs)Pour vérifier que la liste a bien été créée, on peut afficher certains de ses éléments, par exemple les 10ème à 12ème.
#>
#> [[2]]
#>
#> [[3]]
La fonction exporter_les_graphiques_png exporte chacun des graphiques de la liste au format png, le nomme selon les codes SAGEs et station + les intitulés des SAGEs. Ils sont stockés dans le répertoire fourni par l’utilisateur. Si le répertoire n’existe pas, la fonction le crée. Sinon, elle écrase son contenu antérieur. Au final, il y a un fichier par station. L’exécution de la fonction prend environ une seconde par station.
On peut afficher nos résultats dans une fenêtre leaflet au moyen du package mapview avec les popup graphiques.
NB : L’affichage initial prend un peu de temps, variable selon la taille de la région représentée. C’est dû d’une part au chargement des données géographiques et d’autre part au chargement des popups graphiques.
mapviewOptions(basemaps = c("OpenStreetMap", "OpenTopoMap",
"Esri.WorldShadedRelief", "Esri.WorldImagery"))
# mapviewOptions(default = TRUE) permettrait de revenir au paramétrage par défaut
produire_carte_dynamique (couche_sages = sages,
couche_stations = stations_onde_geo,
popups_stations = graphiques)